# -*- coding: utf-8 -*-
"""
数据库配置
目的：配置数据库连接，管理SQLAlchemy引擎和会话
职责：创建数据库引擎、配置连接池、管理数据库会话
"""
from sqlalchemy import create_engine, event
from sqlalchemy.orm import sessionmaker
from app.models.user import Base
import os

# 数据库连接配置
DATABASE_URL = "mysql+pymysql://root:20021010x@43.139.187.139:3307/blog?charset=utf8mb4"

# 创建数据库引擎 - 修复时区问题
engine = create_engine(
    DATABASE_URL,
    echo=True,  # 开发环境下显示SQL日志
    pool_pre_ping=True,  # 连接池预检查
    pool_recycle=3600,  # 连接回收时间
    connect_args={
        'charset': 'utf8mb4',
        'use_unicode': True,
        'connect_timeout': 10,
        'read_timeout': 30,
        'write_timeout': 30
    },
    # 确保使用正确的时区处理
    execution_options={
        "isolation_level": "READ_COMMITTED"
    }
)

# 使用事件监听器确保每次连接都设置正确的时区
@event.listens_for(engine, "connect")
def set_mysql_timezone(dbapi_connection, connection_record):
    """在每次数据库连接时设置时区"""
    with dbapi_connection.cursor() as cursor:
        try:
            # 尝试设置时区为东八区
            cursor.execute("SET time_zone = '+08:00'")
            dbapi_connection.commit()
        except:
            # 如果失败，尝试使用命名时区
            try:
                cursor.execute("SET time_zone = 'Asia/Shanghai'")
                dbapi_connection.commit()
            except:
                # 最后手段：使用UTC时间并在应用层处理
                pass

# 创建会话工厂
SessionLocal = sessionmaker(autocommit=False, autoflush=False, bind=engine)

def get_db():
    """获取数据库会话"""
    db = SessionLocal()
    try:
        yield db
    finally:
        db.close()

def init_db():
    """初始化数据库表"""
    Base.metadata.create_all(bind=engine)